Load required packages.
library(tidyverse)
library(magrittr)
library(Matrix)
library(Seurat)
library(extrafont)
library(patchwork)
library(styler)
options(
styler.addins_style_transformer = "styler::tidyverse_style(indent_by = 4)"
)
Sys.Date()
## [1] "2020-06-17"
DATA_DIR <- "../../data/drop-seq"
MIN_GENES_THRESHOLD <- 200
SEED_USE <- 20200616
N_COMPONENTS <- 50
# N_REPLICATES = 5
# PROPORTION_OF_VARS = 0.1
MINIMAL_NUM_CELLS_REQUIRED_FOR_GENE <- 30
MINIMAL_NUM_COUNTS_REQUIRED_FOR_GENE <- 60
N_COMPONENTS_SELECTED <- 10
source(
file = file.path(
SCRIPT_DIR,
"utilities.R"
)
)
customized_theme_style <- function() {
theme(
# axis.text = element_text(family = "Arial", size = 7),
# axis.title = element_text(family = "Arial", size = 8),
strip.text = element_text(
family = "Arial",
size = 6
),
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
)
}
# load matrix
matrix_readcount_use <- sparseMatrix(
i = readRDS(file.path(
DATA_DIR,
"expr_readcount_raw_csc_indices.rds"
)),
p = readRDS(file.path(
DATA_DIR,
"expr_readcount_raw_csc_indptr.rds"
)),
x = readRDS(file.path(
DATA_DIR,
"expr_readcount_raw_csc_values.rds"
)),
dims = readRDS(file.path(
DATA_DIR,
"expr_readcount_raw_csc_shape.rds"
)),
dimnames = readRDS(file.path(
DATA_DIR,
"expr_readcount_raw_csc_dimnames.rds"
)),
index1 = FALSE
)
matrix_readcount_use <- matrix_readcount_use[
,
sort(colnames(matrix_readcount_use))
]
# format feature names
feature_symbols <- read.table(
file = "../../data/misc/genes.tsv"
)
feature_symbols <- setNames(
object = feature_symbols$V2,
nm = feature_symbols$V1
)
rownames(matrix_readcount_use) <- paste(
rownames(matrix_readcount_use),
feature_symbols[rownames(matrix_readcount_use)],
sep = "_"
) %>% make.names()
colnames(matrix_readcount_use) <- colnames(matrix_readcount_use) %>%
make.names()
# calculate CPM
matrix_cpm_use <- calc_cpm(matrix_readcount_use)
dim(matrix_cpm_use)
## [1] 27999 27416
# filter low quality cells & uninformative features
matrix_readcount_use <- matrix_readcount_use[
,
Matrix::colSums(matrix_readcount_use > 0) >= MIN_GENES_THRESHOLD
]
dim(matrix_readcount_use)
## [1] 27999 25776
matrix_readcount_use <- matrix_readcount_use[
Matrix::rowSums(
matrix_readcount_use > 0
) >= MINIMAL_NUM_CELLS_REQUIRED_FOR_GENE,
]
matrix_readcount_use <- matrix_readcount_use[
Matrix::rowSums(
matrix_readcount_use
) >= MINIMAL_NUM_COUNTS_REQUIRED_FOR_GENE,
]
dim(matrix_readcount_use)
## [1] 16535 25776
# begin
seurat_proj <- CreateSeuratObject(
counts = matrix_readcount_use,
project = "Reprogram-Seq",
assay = "RNA",
min.cells = 0,
min.features = 0,
names.field = 1,
names.delim = "_",
meta.data = NULL
)
## Warning: Feature names cannot have underscores ('_'), replacing with dashes
## ('-')
seurat_proj <- seurat_proj %>%
NormalizeData(
normalization.method = "LogNormalize",
scale.factor = colSums(matrix_readcount_use) %>% median()
)
Inspect variable features.
seurat_proj <- seurat_proj %>%
FindVariableFeatures(
selection.method = "vst",
num.bin = 20,
nfeatures = 3000,
verbose = TRUE
)
Calculate coefficient of variation.
cv <- calc_cv(matrix_cpm_use)
Visualize CV against mean expression.
data.frame(
mean_expr = rowMeans(matrix_cpm_use),
cv = cv
) %>%
rownames_to_column(var = "feature") %>%
filter(
mean_expr > 0
) %>%
mutate(
feature = stringr::str_replace(
string = feature,
pattern = "_",
replacement = "-"
),
is_variable = ifelse(feature %in% VariableFeatures(seurat_proj), 1, 0)
) %>%
arrange(is_variable) %>%
plot_cv(
x = mean_expr,
y = cv,
z = is_variable
)
Scale all features.
# z-score
seurat_proj <- seurat_proj %>%
ScaleData(
features = rownames(seurat_proj),
vars.to.regress = NULL,
model.use = "linear",
use.umi = FALSE,
do.scale = TRUE,
do.center = TRUE,
verbose = TRUE
)
## Centering and scaling data matrix
Use all features.
seurat_proj <- seurat_proj %>%
RunPCA(
assay = NULL,
features = rownames(seurat_proj),
npcs = N_COMPONENTS,
rev.pca = FALSE,
weight.by.var = TRUE,
verbose = TRUE,
ndims.print = 1:2,
nfeatures.print = 5,
reduction.name = "pca",
reduction.key = "PC_",
seed.use = SEED_USE
)
## PC_ 1
## Positive: ENSMUSG00000040752-Myh6, ENSMUSG00000026414-Tnnt2, ENSMUSG00000068614-Actc1, ENSMUSG00000035458-Tnni3, ENSMUSG00000051747-Ttn
## Negative: ENSMUSG00000001025-S100a6, ENSMUSG00000029761-Cald1, ENSMUSG00000068220-Lgals1, ENSMUSG00000024529-Lox, ENSMUSG00000060802-B2m
## PC_ 2
## Positive: ENSMUSG00000032366-Tpm1, ENSMUSG00000031633-Slc25a4, ENSMUSG00000025393-Atp5b, ENSMUSG00000000088-Cox5a, ENSMUSG00000097445-Gm26631
## Negative: ENSMUSG00000027750-Postn, ENSMUSG00000002985-Apoe, ENSMUSG00000019929-Dcn, ENSMUSG00000027239-Mdk, ENSMUSG00000040488-Ltbp4
Add batch information to seurat object.
seurat_proj <- seurat_proj %>% AddMetaData(
metadata = colnames(seurat_proj) %>%
str_remove(pattern = "_[A-Z]{12}.bam"),
col.name = "batch"
)
seurat_proj@meta.data %>%
pull(batch) %>%
table() %>%
enframe(
name = "batch",
value = "num_cells"
)
Run Harmony algorithm on PCs.
set.seed(seed = SEED_USE)
seurat_proj <- seurat_proj %>%
harmony::RunHarmony(
group.by.vars = "batch",
reduction = "pca",
dims.use = NULL,
theta = NULL,
lambda = NULL,
nclust = NULL,
max.iter.harmony = 10,
max.iter.cluster = 20,
epsilon.cluster = 1e-05,
epsilon.harmony = 1e-04,
plot_convergence = FALSE,
verbose = TRUE,
reduction.save = "harmony",
assay.use = "RNA",
project.dim = TRUE,
)
## Harmony 1/10
## Harmony 2/10
## Harmony 3/10
## Harmony 4/10
## Harmony 5/10
## Harmony 6/10
## Harmony 7/10
## Harmony 8/10
## Harmony converged after 8 iterations
## Warning: Invalid name supplied, making object name syntactically valid. New
## object name is Seurat..ProjectDim.RNA.harmony; see ?make.names for more details
## on syntax validity
# check
Embeddings(object = seurat_proj, reduction = "harmony") %>%
dim()
## [1] 25776 50
seurat_proj <- seurat_proj %>%
RunTSNE(
reduction = "harmony",
cells = NULL,
dims = 1:N_COMPONENTS_SELECTED,
features = NULL,
seed.use = SEED_USE,
tsne.method = "Rtsne",
dim.embed = 2,
distance.matrix = NULL,
reduction.name = "tsne",
reduction.key = "tSNE_",
#
perplexity = 30
# max_iter = 3000
)
seurat_proj <- seurat_proj %>%
RunUMAP(
reduction.model = NULL,
dims = 1:N_COMPONENTS_SELECTED,
reduction = "harmony",
features = NULL,
graph = NULL,
assay = "RNA",
umap.method = "uwot",
n.neighbors = 15L,
n.components = 2L,
# metric = "euclidean",
metric = "cosine",
n.epochs = NULL,
learning.rate = 1,
min.dist = 0.1,
spread = 1,
uwot.sgd = FALSE,
seed.use = SEED_USE,
verbose = TRUE,
reduction.name = "umap",
reduction.key = "UMAP_"
)
## Warning: The default method for RunUMAP has changed from calling Python UMAP via reticulate to the R-native UWOT using the cosine metric
## To use Python UMAP via reticulate, set umap.method to 'umap-learn' and metric to 'correlation'
## This message will be shown once per session
## 15:55:48 UMAP embedding parameters a = 1.577 b = 0.8951
## 15:55:48 Read 25776 rows and found 10 numeric columns
## 15:55:48 Using Annoy for neighbor search, n_neighbors = 15
## 15:55:48 Building Annoy index with metric = cosine, n_trees = 50
## 0% 10 20 30 40 50 60 70 80 90 100%
## [----|----|----|----|----|----|----|----|----|----|
## **************************************************|
## 15:55:54 Writing NN index file to temp file /var/folders/h1/78b2tkd552ngjl6_ps_5sw7r0000gn/T//RtmpsOcJ6C/filec5e657aeab9a
## 15:55:54 Searching Annoy index using 1 thread, search_k = 1500
## 15:56:00 Annoy recall = 100%
## 15:56:00 Commencing smooth kNN distance calibration using 1 thread
## 15:56:01 Initializing from normalized Laplacian + noise
## 15:56:03 Commencing optimization for 200 epochs, with 513252 positive edges
## 15:56:14 Optimization finished
seurat_proj <- seurat_proj %>%
FindNeighbors(
reduction = "harmony",
dims = 1:N_COMPONENTS_SELECTED,
assay = NULL,
features = NULL,
k.param = 20,
compute.SNN = TRUE,
nn.method = "rann",
annoy.metric = "euclidean",
nn.eps = 0,
verbose = TRUE,
do.plot = FALSE,
)
## Computing nearest neighbor graph
## Computing SNN
seurat_proj <- seurat_proj %>%
FindClusters(
modularity.fxn = 1,
initial.membership = NULL,
weights = NULL,
node.sizes = NULL,
resolution = 0.8,
method = "igraph",
algorithm = 1,
n.start = 100,
n.iter = 100,
random.seed = SEED_USE,
verbose = TRUE
)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
##
## Number of nodes: 25776
## Number of edges: 819208
##
## Running Louvain algorithm...
## Maximum modularity in 100 random starts: 0.8854
## Number of communities: 20
## Elapsed time: 57 seconds
Summarize clustering result.
seurat_proj %>%
Idents() %>%
table() %>%
enframe(
name = "cluster",
value = "num_cells"
)
Format batch information.
batch <- setNames(
object = c(
"JD131", "JD131", "JD131", "JD131", "JD135", "JD136", "JD137", "JD131",
"JD131", "JD131", "JD136", "JD136", "JD136", "JD136", "JD146", "JD146",
"JD146", "JD146", "JD146", "JD146", "JD136", "JD136", "JD136", "JD136",
"JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136",
"JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136", "JD136",
"JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168",
"JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD136",
"JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168",
"JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168", "JD168",
"JD136", "JD136", "JD174", "JD174", "JD136", "JD136", "JD168", "JD168",
"JD168", "JD168", "JD168", "JD168", "JD174", "JD174", "JD174", "JD174",
"JD174", "JD135", "JD135", "JD135", "JD135"
),
nm = c(
"JD126-1-2", "JD131-A", "JD131-B", "JD131-C", "JD135A", "JD136A",
"JD137A", "JD126A1", "JD126A5", "JD126B", "JD145A1", "JD145A5",
"JD145B1", "JD145B5", "JD146A1", "JD146A5", "JD146B1", "JD146B5",
"JD146C1", "JD146C5", "JD145C", "JD145D", "JD145E", "JD149A", "JD149B",
"JD150A", "JD150B", "JD145F", "JD149C", "JD149D", "JD149E", "JD136B",
"JD136C", "JD136DE", "JD136F", "JD136G", "JD150C", "JD150D",
"JD150-3A", "JD150-3B", "JD164_165", "JD166_167", "JD168_169",
"JD168A", "JD168B", "JD168C", "JD169A", "JD169B", "JD169C", "JD170A",
"JD170B", "JD170C", "JD171A", "JD171B", "JD171C", "JD150-3C",
"JD170_171", "PZ473", "PZ474", "PZ475", "PZ476", "PZ477", "PZ478",
"PZ479", "PZ480", "PZ481", "PZ482", "PZ483", "PZ484", "PZ485", "PZ486",
"PZ487", "PZ492", "PZ493", "PZ496", "PZ497", "JD150-4A", "JD150-4B",
"PZ580", "PZ581", "PZ582", "PZ583", "PZ584", "PZ585", "PZ586", "PZ587",
"PZ588", "PZ589", "PZ590", "PZ660", "PZ661", "JD135Z", "JD135Y"
)
)
batch <- setNames(
object = batch,
nm = names(batch) %>% str_replace_all(pattern = "-", replacement = ".")
)
Prepare embedding data.
embedding <- seurat_proj@reductions$umap@cell.embeddings %>%
cbind(
"cluster" = Idents(seurat_proj),
seurat_proj@reductions$tsne@cell.embeddings
) %>%
as.data.frame() %>%
mutate(cell = rownames(.)) %>%
relocate(cell, cluster) %>%
rename(
"x_umap" = "UMAP_1",
"y_umap" = "UMAP_2",
"x_tsne" = "tSNE_1",
"y_tsne" = "tSNE_2"
)
embedding %>% head()
Visualize different cell groups.
x_column <- "x_tsne"
y_column <- "y_tsne"
p_embedding_cluster <- plot_embedding(
embedding = embedding[, c(x_column, y_column)],
title = "t-SNE; Cluster",
group = as.vector(embedding$cluster) %>% as.factor(),
show_group_labels = TRUE,
geom_point_size = 0.6
) + customized_theme_style()
## `summarise()` ungrouping output (override with `.groups` argument)
p_embedding_primary <- plot_embedding(
embedding = embedding[, c(x_column, y_column)],
title = "t-SNE; Primary",
group = (!batch[embedding$cell %>%
str_remove("_[A-Z]{12}.bam")] %in%
c("JD168", "JD174")) %>%
as.integer() %>% as.factor(),
show_group_labels = FALSE,
geom_point_size = 0.6,
sort_values = TRUE
) +
customized_theme_style() +
scale_color_manual(
values = c("grey70", "salmon")
)
p_embedding_reprogramming <- plot_embedding(
embedding = embedding[, c(x_column, y_column)],
title = "t-SNE; Reprogramming",
group = batch[embedding$cell %>%
str_remove("_[A-Z]{12}.bam")] %in% c("JD168") %>%
as.integer() %>%
as.factor(),
show_group_labels = FALSE,
geom_point_size = 0.6,
sort_values = TRUE
) +
customized_theme_style() +
scale_color_manual(
values = c("grey70", "salmon")
)
p_embedding_control <- plot_embedding(
embedding = embedding[, c(x_column, y_column)],
title = "t-SNE; Control",
group = batch[embedding$cell %>%
str_remove("_[A-Z]{12}.bam")] %in% c("JD174") %>%
as.integer() %>%
as.factor(),
show_group_labels = FALSE,
geom_point_size = 0.6,
sort_values = TRUE
) +
customized_theme_style() +
scale_color_manual(
values = c("grey70", "salmon")
)
(p_embedding_cluster | p_embedding_primary) / (
p_embedding_reprogramming | p_embedding_control
)
Prepare helper function.
plot_embedding_feature <- function(selected_feature,
xx = "x_tsne",
yy = "y_tsne",
label_prefix = "t-SNE") {
p_embedding <- plot_embedding(
embedding = embedding[, c(xx, yy)],
title = paste0(label_prefix, "; ", selected_feature),
group = log10(matrix_cpm_use[selected_feature, embedding$cell] + 1),
show_group_labels = FALSE,
geom_point_size = 0.6,
color_legend = TRUE,
sort_values = TRUE,
strip.text = element_text(
family = "Arial",
size = 6
),
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
legend.justification = c(1, 0),
legend.position = c(.92, .08),
legend.text = element_text(
family = "Arial",
size = 4,
margin = margin(
t = 0,
r = 0,
b = 0,
l = -1.8,
unit = "mm"
)
),
legend.key.size = unit(1.5, "mm"),
legend.margin = margin(t = 0, r = 0, b = 0, l = 0, unit = "mm")
) +
scale_color_viridis_c(
name = NULL
)
return(p_embedding)
}
t-SNE
selected_feature <- "ENSMUSG00000025105_Bnc1"
p_embedding_Bnc1 <- plot_embedding_feature(selected_feature = selected_feature)
selected_feature <- "ENSMUSG00000009471_Myod1"
p_embedding_Myod1 <- plot_embedding_feature(selected_feature = selected_feature)
p_embedding_Myod1 | p_embedding_Bnc1
embedding %>%
filter(
cluster == 13
) %>%
pull(cell) %>%
str_remove(
pattern = "_[A-Z]{12}.bam"
) %>%
batch[.] %>%
table()
## .
## JD131 JD135 JD136 JD137 JD146 JD168 JD174
## 51 20 282 2 33 170 45
if (require(devtools)) {
devtools::session_info()
} else {
sessionInfo()
}
## Loading required package: devtools
## Loading required package: usethis
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.0.1 (2020-06-06)
## os macOS Catalina 10.15.5
## system x86_64, darwin19.5.0
## ui unknown
## language (EN)
## collate en_US.UTF-8
## ctype en_US.UTF-8
## tz America/Chicago
## date 2020-06-17
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date lib
## ape 5.4 2020-06-03 [1]
## assertthat 0.2.1 2019-03-21 [1]
## backports 1.1.8 2020-06-17 [1]
## blob 1.2.1 2020-01-20 [1]
## broom 0.7.0.9000 2020-06-09 [1]
## callr 3.4.3.9000 2020-06-17 [1]
## cellranger 1.1.0 2016-07-27 [1]
## cli 2.0.2 2020-02-28 [1]
## cluster 2.1.0 2019-06-19 [2]
## codetools 0.2-16 2018-12-24 [2]
## colorspace 1.4-1 2019-03-18 [1]
## cowplot 1.0.0 2019-07-11 [1]
## crayon 1.3.4 2017-09-16 [1]
## data.table 1.12.8 2019-12-09 [1]
## DBI 1.1.0 2019-12-15 [1]
## dbplyr 1.4.4 2020-05-27 [1]
## desc 1.2.0 2018-05-01 [1]
## devtools * 2.3.0.9000 2020-06-16 [1]
## digest 0.6.25 2020-02-23 [1]
## dplyr * 1.0.0.9000 2020-06-16 [1]
## ellipsis 0.3.1 2020-05-15 [1]
## evaluate 0.14 2019-05-28 [1]
## extrafont * 0.17 2014-12-08 [1]
## extrafontdb 1.0 2012-06-11 [1]
## fansi 0.4.1 2020-01-08 [1]
## farver 2.0.3 2020-01-16 [1]
## fitdistrplus 1.1-1 2020-05-19 [1]
## forcats * 0.5.0.9000 2020-05-28 [1]
## fs 1.4.1 2020-04-04 [1]
## future 1.17.0 2020-04-18 [1]
## future.apply 1.5.0 2020-04-17 [1]
## generics 0.0.2 2018-11-29 [1]
## ggplot2 * 3.3.1.9000 2020-06-16 [1]
## ggrepel 0.9.0 2020-04-25 [1]
## ggridges 0.5.2 2020-01-12 [1]
## globals 0.12.5 2019-12-07 [1]
## glue 1.4.1 2020-05-13 [1]
## gridExtra 2.3 2017-09-09 [1]
## gtable 0.3.0 2019-03-25 [1]
## harmony 1.0 2020-04-29 [1]
## haven 2.3.1 2020-06-01 [1]
## hms 0.5.3 2020-01-08 [1]
## htmltools 0.5.0 2020-06-16 [1]
## htmlwidgets 1.5.1 2019-10-08 [1]
## httr 1.4.1 2019-08-05 [1]
## ica 1.0-2 2018-05-24 [1]
## igraph 1.2.5 2020-03-19 [1]
## irlba 2.3.3 2019-02-05 [1]
## jsonlite 1.6.1 2020-02-02 [1]
## KernSmooth 2.23-17 2020-04-26 [2]
## knitr 1.28 2020-02-06 [1]
## labeling 0.3 2014-08-23 [1]
## lattice 0.20-41 2020-04-02 [2]
## lazyeval 0.2.2 2019-03-15 [1]
## leiden 0.3.3 2020-02-04 [1]
## lifecycle 0.2.0 2020-03-06 [1]
## listenv 0.8.0 2019-12-05 [1]
## lmtest 0.9-37 2019-04-30 [1]
## lubridate 1.7.9 2020-06-14 [1]
## magrittr * 1.5.0.9000 2020-04-24 [1]
## MASS 7.3-51.6 2020-04-26 [2]
## Matrix * 1.2-18 2019-11-27 [2]
## memoise 1.1.0 2017-04-21 [1]
## modelr 0.1.8.9000 2020-05-19 [1]
## munsell 0.5.0 2018-06-12 [1]
## nlme 3.1-148 2020-05-24 [2]
## patchwork * 1.0.0.9000 2020-06-17 [1]
## pbapply 1.4-2 2019-08-31 [1]
## pillar 1.4.4 2020-05-05 [1]
## pkgbuild 1.0.8 2020-05-07 [1]
## pkgconfig 2.0.3 2019-09-22 [1]
## pkgload 1.1.0 2020-05-29 [1]
## plotly 4.9.2.1 2020-04-04 [1]
## plyr 1.8.6 2020-03-03 [1]
## png 0.1-7 2013-12-03 [1]
## prettyunits 1.1.1.9000 2020-04-24 [1]
## processx 3.4.2 2020-02-09 [1]
## ps 1.3.3 2020-05-08 [1]
## purrr * 0.3.4.9000 2020-05-28 [1]
## R6 2.4.1.9000 2020-06-12 [1]
## RANN 2.6.1 2019-01-08 [1]
## RColorBrewer 1.1-2 2014-12-07 [1]
## Rcpp 1.0.4.6 2020-04-09 [1]
## RcppAnnoy 0.0.16 2020-03-08 [1]
## readr * 1.3.1.9000 2020-05-28 [1]
## readxl 1.3.1.9000 2020-05-28 [1]
## remotes 2.1.1.9000 2020-05-01 [1]
## reprex 0.3.0 2019-05-16 [1]
## reshape2 1.4.4 2020-04-09 [1]
## reticulate * 1.16 2020-05-27 [1]
## rlang 0.4.6.9000 2020-06-17 [1]
## rmarkdown 2.2.6 2020-06-17 [1]
## ROCR 1.0-11 2020-05-02 [1]
## rprojroot 1.3-2 2018-01-03 [1]
## RSpectra 0.16-0 2019-12-01 [1]
## rstudioapi 0.11.0-9000 2020-06-11 [1]
## rsvd 1.0.3 2020-02-17 [1]
## Rtsne 0.16 2020-04-24 [1]
## Rttf2pt1 1.3.8 2020-01-10 [1]
## rvest 0.3.5 2019-11-08 [1]
## scales 1.1.1 2020-05-11 [1]
## sctransform 0.2.1 2019-12-17 [1]
## sessioninfo 1.1.1 2018-11-05 [1]
## Seurat * 3.1.5.9008 2020-06-17 [1]
## stringi 1.4.6 2020-02-17 [1]
## stringr * 1.4.0.9000 2020-06-01 [1]
## styler * 1.3.2.9000 2020-06-06 [1]
## survival 3.2-3 2020-06-13 [2]
## testthat 2.3.2.9000 2020-06-17 [1]
## tibble * 3.0.1.9000 2020-06-17 [1]
## tidyr * 1.1.0.9000 2020-05-26 [1]
## tidyselect 1.1.0 2020-05-11 [1]
## tidyverse * 1.3.0.9000 2020-06-01 [1]
## usethis * 1.6.1.9000 2020-06-12 [1]
## uwot 0.1.8.9000 2020-04-24 [1]
## vctrs 0.3.1.9000 2020-06-17 [1]
## viridisLite 0.3.0 2018-02-01 [1]
## withr 2.2.0 2020-04-20 [1]
## xfun 0.14 2020-05-20 [1]
## xml2 1.3.2 2020-04-23 [1]
## yaml 2.2.1 2020-02-01 [1]
## zoo 1.8-8 2020-05-02 [1]
## source
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.1)
## CRAN (R 4.0.0)
## Github (tidymodels/broom@c7bef07)
## Github (r-lib/callr@b96da8f)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.1)
## CRAN (R 4.0.1)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (r-lib/devtools@020c1d2)
## CRAN (R 4.0.0)
## Github (tidyverse/dplyr@fd08fe9)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (tidyverse/forcats@ab81d1b)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (tidyverse/ggplot2@7e9e9d6)
## Github (slowkow/ggrepel@3941cf1)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (immunogenomics/harmony@88b1e2a)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.1)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.1)
## CRAN (R 4.0.1)
## CRAN (R 4.0.0)
## CRAN (R 4.0.1)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (tidyverse/lubridate@bccea9a)
## Github (tidyverse/magrittr@93cdc9a)
## CRAN (R 4.0.1)
## CRAN (R 4.0.1)
## CRAN (R 4.0.0)
## Github (tidyverse/modelr@16168e0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.1)
## Github (thomasp85/patchwork@3616cd1)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (r-lib/prettyunits@b1cdad8)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (tidyverse/purrr@5e9888a)
## Github (r-lib/R6@1415d11)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (tidyverse/readr@ec0d898)
## Github (tidyverse/readxl@3815961)
## Github (r-lib/remotes@9b5dc29)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (r-lib/rlang@7f0c363)
## Github (rstudio/rmarkdown@656b3f4)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (rstudio/rstudioapi@ed5dd25)
## CRAN (R 4.0.0)
## Github (jkrijthe/Rtsne@14b195f)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## Github (satijalab/seurat@7c386af)
## CRAN (R 4.0.0)
## Github (tidyverse/stringr@f70c4ba)
## Github (r-lib/styler@9c5d883)
## CRAN (R 4.0.1)
## Github (r-lib/testthat@b684f1e)
## Github (tidyverse/tibble@3f4e5df)
## Github (tidyverse/tidyr@3899ed5)
## CRAN (R 4.0.0)
## Github (hadley/tidyverse@8a0bb99)
## Github (r-lib/usethis@5475c46)
## Github (jlmelville/uwot@cbb78b5)
## Github (r-lib/vctrs@833956a)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
## CRAN (R 4.0.0)
##
## [1] /usr/local/lib/R/4.0/site-library
## [2] /usr/local/Cellar/r/4.0.1/lib/R/library